﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;

namespace BLL
{
    public class HorasExtras_BLL
    {
         #region singleton
        private static HorasExtras_BLL instance;

        private HorasExtras_BLL() { }

        public static HorasExtras_BLL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new HorasExtras_BLL();
                }
                return instance;
            }
        }
        #endregion

        public void Activar_DesactivarHorasExtra(int id_HoraExtra)
        {
            hrpEntities hrp = new hrpEntities();
            hrp_horasextra hora = hrp.hrp_horasextra.FirstOrDefault(f => f.id == id_HoraExtra);
            hora.activo = !hora.activo;
            hrp.SaveChanges();
        }

        public void AlterarHorasExtra(int horasExtraId, int id_empresa, int id_funcionario, DateTime data_inicio,
           string obs, string ip, string user_id, double valorHoraExtra, int numeroHoras)
        {
            DateTime timestamp = DateTime.Now;
            hrpEntities hrp = new hrpEntities();
            hrp_horasextra actualFalta = hrp.hrp_horasextra.FirstOrDefault(f => f.id == horasExtraId && f.id_funcionario == id_funcionario);
            CriarLog(hrp, ref actualFalta, user_id, "", timestamp);
            actualFalta.data_inicio = data_inicio;
            actualFalta.obs = obs;
            actualFalta.numeroHoras = numeroHoras;
            actualFalta.valor = valorHoraExtra;
            actualFalta.user_id = user_id;
            actualFalta.user_ip = ip;
            actualFalta.user_timestamp = timestamp;
            hrp.SaveChanges();

        }

        public void CriarLog(hrpEntities hrp, ref hrp_horasextra actualHoraExtra, string userId, string userIp, DateTime userTimestamp)
        {
            hrp_horasextra_log horasExtraLog = new hrp_horasextra_log();
            horasExtraLog.activo = actualHoraExtra.activo;
            horasExtraLog.data_inicio = actualHoraExtra.data_inicio;
            horasExtraLog.id = actualHoraExtra.id;
            horasExtraLog.id_empresa = actualHoraExtra.id_empresa;
            horasExtraLog.id_funcionario = actualHoraExtra.id_funcionario;
            horasExtraLog.obs = actualHoraExtra.obs;
            horasExtraLog.user_id = userId;
            horasExtraLog.user_ip = userIp;
            horasExtraLog.user_timestamp = userTimestamp;
            horasExtraLog.obs = actualHoraExtra.obs;
            horasExtraLog.valor = actualHoraExtra.valor;
            horasExtraLog.numeroHoras = actualHoraExtra.numeroHoras;
            hrp.hrp_horasextra_log.Add(horasExtraLog);

        }

        public bool HorasExtrasExiste(int horasExtraId, int id_funcionario)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_horasextra.Any(f => f.id_funcionario == id_funcionario && f.id == horasExtraId);
        }

        public int inserirHoraExtra(int id_cliente, int id_empresa, int id_funcionario, DateTime data_hora,
           string obs, string ip, string user_id, double valorHoraExtra, int numeroHoras)
        {
            int result = 0;
            try
            {
                hrpEntities hrp = new hrpEntities();
                hrp_horasextra novaHoraExtra = new hrp_horasextra();
                novaHoraExtra.activo = true;
                novaHoraExtra.data_inicio = data_hora;
                novaHoraExtra.id_empresa = id_empresa;
                novaHoraExtra.id_funcionario = id_funcionario;
                novaHoraExtra.obs = obs;
                novaHoraExtra.user_id = user_id;
                novaHoraExtra.user_ip = ip;
                novaHoraExtra.user_timestamp = DateTime.Now;
                novaHoraExtra.valor = valorHoraExtra;
                novaHoraExtra.numeroHoras = numeroHoras;

                hrp.hrp_horasextra.Add(novaHoraExtra);
                hrp.SaveChanges();

                result = novaHoraExtra.id;
            }
            catch (Exception)
            {

                throw;
            }


            return result;
        }

        public List<hrp_horasextra> horasExtraFuncionarioMes(int id_funcionario, DateTime datainicio, DateTime datafim)
        {
            hrpEntities hrp = new hrpEntities();
            var horasExtra = from horaExtra in hrp.hrp_horasextra
                             where horaExtra.id_funcionario == id_funcionario
                             && horaExtra.data_inicio >= datainicio && horaExtra.data_inicio <= datafim
                             select horaExtra;
            return horasExtra.ToList();
        }
    }
}
